package org.opencv.test1;


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;

class Preview extends SurfaceView implements SurfaceHolder.Callback {
	private static final String TAG = "Preview";
	private OpenCV opencv = new OpenCV();
	SurfaceHolder mHolder;
	public Camera camera;

	private boolean isEnabled = false;
	private boolean isRemote = false;

	Preview(Context context) {
		super(context);

		// Install a SurfaceHolder.Callback so we get notified when the
		// underlying surface is created and destroyed.
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void enable(){
		isEnabled = true;
	}

	public void setRemote(boolean isRemote){
		this.isRemote = isRemote;
	}

	public void surfaceCreated(SurfaceHolder holder) {
		setWillNotDraw(false);

		// The Surface has been created, acquire the camera and tell it where
		// to draw.
		camera = Camera.open();
		try {
			
			camera.setPreviewDisplay(holder);
			Parameters param = camera.getParameters();
			param.setPreviewFrameRate(1);
			param.setColorEffect(Camera.Parameters.EFFECT_MONO);
			camera.setParameters(param);

			camera.setPreviewCallback(new PreviewCallback() {
				
				public void onPreviewFrame(byte[] data, Camera arg1) {
					int width = arg1.getParameters().getPictureSize().width;
					int height = arg1.getParameters().getPictureSize().height;
					int[] rgb = Utility.decodeYUV420SP(data, width, height);
					Bitmap bmp = Bitmap.createBitmap(rgb, width, height,Bitmap.Config.ARGB_8888);
					try{
						String filename="/sdcard/223.jpg"; 
						FileOutputStream out;
						out = new FileOutputStream(filename);
						bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
						out.flush();
						out.close();
						out=null;
						
						if(!isEnabled)
							return;
						if(isRemote){
							// here u wanna send the image to socket...
							Socket socket = new Socket("192.168.0.186",12345);
							OutputStream os = socket.getOutputStream();
							bmp.compress(CompressFormat.PNG, 0, os);
							os.flush();
							os.close();
						}
						else
						{
							// local image processing!

							int[] pixels = new int[width * height];
							bmp.getPixels(pixels, 0, width, 0, 0, width, height);
							opencv.setSourceImage(pixels, width, height);
							long start = System.currentTimeMillis();
							opencv.extractSURFFeature();
							long end = System.currentTimeMillis();
							byte[] imageData = opencv.getSourceImage();
							long elapse = end - start;

							bmp = BitmapFactory.decodeByteArray(imageData, 0,
									imageData.length);
							Socket socket = new Socket("192.168.0.186",12345);
							OutputStream os = socket.getOutputStream();
							bmp.compress(CompressFormat.PNG, 0, os);
							os.flush();
							os.close();
								
						}

					}catch(Exception e){};

				}
			});
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		// Surface will be destroyed when we return, so stop the preview.
		// Because the CameraDevice object is not a shared resource, it's very
		// important to release it when the activity is paused.
		camera.stopPreview();
		camera = null;
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		// Now that the size is known, set up the camera parameters and begin
		// the preview.
		Camera.Parameters parameters = camera.getParameters();
		parameters.setPreviewSize(w, h);

		camera.setParameters(parameters);
		camera.startPreview();
	}

	@Override
	public void draw(Canvas canvas) {
		super.draw(canvas);
		Paint p = new Paint(Color.RED);
		Log.d(TAG, "draw");

		canvas.drawText("PREVIEW", canvas.getWidth() / 2,
				canvas.getHeight() / 2, p);
	}
	
	@Override
    protected void onDraw(Canvas canvas){
		Paint p = new Paint(Color.RED);
		Log.d(TAG, "draw");

		canvas.drawText("PREVIEW", canvas.getWidth() / 2,
				canvas.getHeight() / 2, p);
        Log.w(this.getClass().getName(), "On Draw Called");
    }

}